#include "stm32f10x.h"

// 7段显示器引脚定义
#define SEG_A GPIO_Pin_6
#define SEG_B GPIO_Pin_7
#define SEG_C GPIO_Pin_8
#define SEG_D GPIO_Pin_11
#define SEG_E GPIO_Pin_12
#define SEG_F GPIO_Pin_13
#define SEG_G GPIO_Pin_14

// 7段显示数字映射 7seg-mpx1-ca共阳极数码管低电平驱动
const uint8_t SegmentMap[10][7] = 
{
    {0, 0, 0, 0, 0, 0, 1}, // 0
    {1, 0, 0, 1, 1, 1, 1}, // 1
    {0, 0, 1, 0, 0, 1, 0}, // 2
    {0, 0, 0, 0, 1, 1, 0}, // 3
    {1, 0, 0, 1, 1, 0, 0}, // 4
    {0, 1, 0, 0, 1, 0, 0}, // 5
    {0, 1, 0, 0, 0, 0, 0}, // 6
    {0, 0, 0, 1, 1, 1, 1}, // 7
    {0, 0, 0, 0, 0, 0, 0}, // 8
    {0, 0, 0, 0, 1, 0, 0}  // 9
};

// 初始化GPIO
void Nixie_Init(void) 
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟

    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G; // 选择引脚
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度
    GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA
}

// 显示数字
void Nixie_DisplayDigit(uint8_t Digit) 	
{
    // 确保Digit在0-9范围内
    if (Digit > 9) 
		return;

    // 控制7段显示器
    GPIO_SetBits(GPIOA, SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G); // 清空输出
    if (SegmentMap[Digit][0] == 0) GPIO_ResetBits(GPIOA, SEG_A);
    if (SegmentMap[Digit][1] == 0) GPIO_ResetBits(GPIOA, SEG_B);
    if (SegmentMap[Digit][2] == 0) GPIO_ResetBits(GPIOA, SEG_C);
    if (SegmentMap[Digit][3] == 0) GPIO_ResetBits(GPIOA, SEG_D);
    if (SegmentMap[Digit][4] == 0) GPIO_ResetBits(GPIOA, SEG_E);
    if (SegmentMap[Digit][5] == 0) GPIO_ResetBits(GPIOA, SEG_F);
    if (SegmentMap[Digit][6] == 0) GPIO_ResetBits(GPIOA, SEG_G);
}
